; 文件名: boot.s
; 编译命令: nasm mbr.s -f bin -o mbr.bin

bits 16         ; 16位实模式
org 0x7C00      ; BIOS 加载MBR到内存地址0x7C00

start:
    ; 初始化段寄存器
    xor ax, ax
    mov ds, ax
    mov es, ax

    ; 显示字符 'A'
    mov ah, 0x0E        ; BIOS 中断0x10的功能号: 显示字符
    mov al, 'A'         ; 要显示的字符
    int 0x10            ; 调用BIOS中断

    ; 无限循环
    cli                 ; 关闭中断
    hlt                 ; 挂起CPU
    jmp $               ; 冗余跳转 (确保代码终止)

; 填充剩余空间并添加MBR签名
times 510 - ($ - $$) db 0   ; 填充510字节
dw 0xAA55                   ; MBR结束标志 (小端存储)

load_bootloader:
    ; 设置读取的扇区数
    mov dx, 0x1F2
    mov al, 1           ; 读取1个扇区
    out dx, al
    ; 设置要读取的扇区号（LBA地址）
    mov dx, 0x1F3
    mov al, 1           ; LBA 地址低8位（第1扇区）
    out dx, al
    ; 设置柱面号（LBA地址的8-23位）
    mov dx, 0x1F4
    mov al, 0           ; LBA 地址的8-15位
    out dx, al
    mov dx, 0x1F5
    mov al, 0           ; LBA 地址的16-23位
    out dx, al
    ; 设置驱动器和LBA的高4位
    mov dx, 0x1F6
    mov al, 0xE0        ; 主驱动器，LBA 地址的24-27位
    out dx, al
    ; 发送读命令
    mov dx, 0x1F7
    mov al, 0x20        ; 0x20 是读取命令
    out dx, al
    ; 等待磁盘准备就绪
    .wait_ready:
        in al, dx
        test al, 0x80   ; 检查 BSY 位（位7）
        jnz .wait_ready
    ; 读取数据
    mov dx, 0x1F0       ; 数据端口
    mov cx, 256         ; 每个扇区512字节 / 2 = 256次读取
    rep insw            ; 从端口读取数据到内存